package com.dgy.project.service.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.dgy.common.constants.ProjectConstants;
import com.dgy.project.domain.ProjectApplyFile;
import com.dgy.project.domain.ProjectInfo;
import com.dgy.project.mapper.ProjectApplyFileMapper;
import com.dgy.project.mapper.ProjectInfoMapper;
import com.dgy.project.pojo.dto.ProjectApplyListDTO;
import com.dgy.project.pojo.vo.ProjectApplyListVO;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dgy.project.mapper.ProjectApplyMapper;
import com.dgy.project.domain.ProjectApply;
import com.dgy.project.service.IProjectApplyService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 项目节点Service业务层处理
 *
 * @author ccc
 * @date 2025-03-26
 */
@Service
public class ProjectApplyServiceImpl implements IProjectApplyService
{
    @Autowired
    private ProjectApplyMapper projectApplyMapper;

    @Autowired
    private ProjectApplyFileMapper projectApplyFileMapper;
    @Autowired
    private ProjectInfoMapper projectInfoMapper;


    /**
     * 查询项目节点
     *
     * @param applyId 项目节点主键
     * @return 项目节点
     */
    @Override
    public ProjectApply selectProjectApplyById(Long applyId)
    {
        return projectApplyMapper.selectProjectApplyById(applyId);
    }

    @Override
    public ProjectApply selectProjectApply(ProjectApply projectApply) {
        return projectApplyMapper.selectProjectApply(projectApply);
    }

    /**
     * 查询项目节点列表
     *
     * @param projectApply 项目节点
     * @return 项目节点
     */
    @Override
    public List<ProjectApply> selectProjectApplyList(ProjectApply projectApply)
    {
        return projectApplyMapper.selectProjectApplyList(projectApply);
    }

    /**
     * 新增项目节点
     *
     * @param projectApply 项目节点
     * @return 结果
     */
    @Override
    public int insertProjectApply(ProjectApply projectApply)
    {
        projectApply.setCreateTime(DateUtils.getNowDate());
        return projectApplyMapper.insertProjectApply(projectApply);
    }

    /**
     * 修改项目节点
     *
     * @param projectApply 项目节点
     * @return 结果
     */
    @Override
    public int updateProjectApply(ProjectApply projectApply)
    {
        projectApply.setUpdateTime(DateUtils.getNowDate());
        return projectApplyMapper.updateProjectApply(projectApply);
    }

    /**
     * 批量删除项目节点
     *
     * @param applyIds 需要删除的项目节点主键
     * @return 结果
     */
    @Override
    public int deleteProjectApplyByIds(Long[] applyIds)
    {
        return projectApplyMapper.deleteProjectApplyByIds(applyIds);
    }

    /**
     * 删除项目节点信息
     *
     * @param applyId
     * @return 结果
     */
    @Override
    public int deleteProjectApplyById(Long applyId)
    {
        return projectApplyMapper.deleteProjectApplyById(applyId);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public int saveProjectApply(ProjectApply projectApply) {
        // 查询该项目是否已经提交了申请
        ProjectApply queryApply = new ProjectApply();
        queryApply.setProjectId(projectApply.getProjectId());
        queryApply.setApplyStep(projectApply.getApplyStep());
        List<ProjectApply> applyList = projectApplyMapper.selectProjectApplyList(queryApply);
        ProjectApply originApply = null;
        if(CollUtil.isNotEmpty(applyList)){
            originApply = applyList.get(0);
            if(ProjectConstants.AUDIT_STATUS_SUBMIT.equals(originApply.getApplyStatus())
                    || ProjectConstants.AUDIT_STATUS_PASS.equals(originApply.getApplyStatus())
            ){
                throw new RuntimeException("该项目当前状态不允许变更");
            }else if(ProjectConstants.AUDIT_STATUS_REJECT.equals(originApply.getApplyStatus())){
                // 若项目已审核-且审核未通过，将原有审核记录置为失效
                projectApplyMapper.deleteProjectApplyById(originApply.getApplyId());
                originApply = null;
            }
        }
        // 根据applyId判断新增还是更新
        if(ObjectUtil.isEmpty(originApply)) {
            // 新增申请
            projectApplyMapper.insertProjectApply(projectApply);
            // 新增附件文件
            List<ProjectApplyFile> fileList = projectApply.getProjectApplyFileList();
            for (ProjectApplyFile projectApplyFile : fileList) {
                projectApplyFile.setApplyId(projectApply.getApplyId());
                projectApplyFile.setProjectId(projectApply.getProjectId());
                projectApplyFile.setApplyStep(projectApply.getApplyStep());
            }
            projectApplyFileMapper.insertProjectApplyFileBatch(fileList);
        }else{
            // 更新申请
            projectApply.setApplyId(originApply.getApplyId());
            projectApply.setUpdateTime(DateUtils.getNowDate());
            projectApplyMapper.updateProjectApply(projectApply);

            // 处理附件文件，若传参中有fileId表明已经保存，否则表明新上传的
            List<Long> retainFileIds = projectApply.getProjectApplyFileList().stream()
                    .filter( file ->ObjectUtil.isNotEmpty(file.getFileId()))
                    .map(ProjectApplyFile::getFileId).collect(Collectors.toList());
            if(CollUtil.isEmpty(retainFileIds)){
                projectApplyFileMapper.deleteProjectApplyFileByApplyId(originApply.getApplyId());
            }else{
                // 查询申请中有效的附件文件--将不保留的文件删除
                ProjectApplyFile searchApplyFile = new ProjectApplyFile();
                searchApplyFile.setApplyId(originApply.getApplyId());
                searchApplyFile.setFileStatus(ProjectConstants.FLAG_YES);
                List<ProjectApplyFile> originFileList = projectApply.getProjectApplyFileList();
                List<Long> deleteFileIds = originFileList.stream()
                        .filter(file ->!retainFileIds.contains(file.getFileId()))
                        .map(ProjectApplyFile::getFileId).collect(Collectors.toList());
                if(CollUtil.isNotEmpty(deleteFileIds)){
                    projectApplyFileMapper.deleteProjectApplyFileByIds(deleteFileIds.toArray(new Long[0]));
                }
            }
            // 新增附件文件
            List<ProjectApplyFile> newFileList = new ArrayList<>();
            for (ProjectApplyFile projectApplyFile : projectApply.getProjectApplyFileList()) {
                if(ObjectUtil.isNotEmpty(projectApplyFile.getFileId())){
                    continue;
                }
                projectApplyFile.setApplyId(projectApply.getApplyId());
                projectApplyFile.setProjectId(projectApply.getProjectId());
                projectApplyFile.setApplyStep(projectApply.getApplyStep());
                newFileList.add(projectApplyFile);
            }
            if(CollUtil.isNotEmpty(newFileList)){
                projectApplyFileMapper.insertProjectApplyFileBatch(newFileList);
            }
        }
        // 变更项目申请状态为待审核
        ProjectInfo projectInfo = new ProjectInfo();
        projectInfo.setProjectId(projectApply.getProjectId());
        projectInfo.setProjectStatus(projectApply.getApplyStatus());
        projectInfoMapper.updateProjectInfo(projectInfo);
        return 1;
    }

    @Override
    public List<ProjectApplyListVO> selectValidApplyList(ProjectApplyListDTO projectApplyListDTO) {
        return projectApplyMapper.selectValidApplyList(projectApplyListDTO);
    }

}
